<?php

namespace app\common\redis\db0;

/**
 * redis操作类
 */
class RedisAbstract {

    /**
     * 连接的库
     * 
     * @var int 
     */
    protected $_db = 0;
    static $redis = null;

    /**
     * 获取是否开启缓存的设置参数
     * 
     * @return boolean
     */
    public function _getEnable() {
        $conf = Config('redis');
        return $conf['enable'];
    }

    /**
     * 获取缓存过期时间
     * 
     * @return int
     */
    public function _getTimeout() {
        $conf = Config('redis');
        return $conf['timeout'];
    }

    /**
     * 获取redis连接
     * 
     * @staticvar null $redis
     * @return \Redis
     * @throws \Exception
     */
    public function getRedis() {
        if (!self::$redis) {
            $conf = Config('redis');
            if (!$conf) {
                throw new \Exception('redis连接必须设置');
            }

            self::$redis = new \Redis();
            self::$redis->connect($conf['host'], $conf['port']);
            self::$redis->select($this->_db);
        }
        return self::$redis;
    }

    /**
     * 删除key
     * 
     * @param string $key
     * @return 
     */
    public function del($key) {
        return $this->getRedis()->del($key);
    }
    /**
     * 移除列表中与参数 VALUE 相等的元素。
     *
     * @param string $key
     * @return
     */
    public function lRem($key,$value,$count=1) {
        return $this->getRedis()->lRem($key, $value, $count );
    }
    /**
     * 获取长度
     *
     * @param string $key
     * @return
     */
    public function lLen($key) {
        return $this->getRedis()->lLen($key);
    }
    /**
     * 将一个值插入到已存在的列表头部
     *
     * @param string $key
     * @return
     */
    public function lPushx($key,$value) {
        return $this->getRedis()->lPushx($key,$value);
    }
    /**
     * 获取keys
     * 
     * @param string $pattern
     */
    public function keys($pattern) {
        return $this->getRedis()->keys($pattern);
    }

    /**
     * 增加缓存
     * 
     * @param string $key
     * @param mix $value
     */
    public function set($key, $value) {
        if (!$this->_getEnable()) {
            return null;
        }
        return $this->getRedis()->set($key, $value);
    }

    /**
     * 根据key值获取缓存数据
     * 
     * @param string $key
     * @return mixed
     */
    public function get($key) {
        if (!$this->_getEnable()) {
            return null;
        }
        return $this->getRedis()->get($key);
    }

    /**
     * redis自增1
     * 
     * @param string $key
     * @return int
     */
    public function incr($key) {
        return $this->getRedis()->incr($key);
    }

    /**
     * redis自减1
     * 
     * @param string $key
     * @return int
     */
    public function decr($key) {
        return $this->getRedis()->decr($key);
    }

    /**
     * redis自减1
     * 
     * @param string $key
     * @return int
     */
    public function decrby($key, $decrement) {
        return $this->getRedis()->decrby($key, $decrement);
    }

    /**
     * 增加列表内的元素
     * 
     * @param string $key
     * @param mix $value
     * @return int
     */
    public function lpush($key, $value) {
        return $this->getRedis()->lpush($key, $value);
    }

    /**
     * 获取列表内的元素
     * 
     * @param string $key
     * @param int $start
     * @param int $stop
     * @return mix
     */
    public function lrange($key, $start, $stop) {
        return $this->getRedis()->lrange($key, $start, $stop);
    }

    /**
     * 增加集合内的元素
     * 
     * @param string $key
     * @param mix $value
     * @return int
     */
    public function sadd($key, $value) {
        return $this->getRedis()->sadd($key, $value);
    }

    /**
     * 列出集合内的元素
     * 
     * @param int $key
     * @return mix
     */
    public function smembers($key) {
        return $this->getRedis()->smembers($key);
    }

    
}
